package com.sky.Database;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.content.Context;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBHelper extends SQLiteOpenHelper {

	private SQLiteDatabase dataBase;
	public String DB_PATH = "/data/data/com.sky.heathcare/databases/";
	public static String DB_NAME = "health.sqlite";
	public static final int version = '1';
	private final Context currentContext;

	public DBHelper(Context context) {
		super(context, DB_NAME, null, version);
		currentContext = context;
		// DB_PATH = "/data/data/de.gimik.apps.domesticremedy/databases/";
		try {
			createDataBase();
		} catch (Exception e) {
			Log.e("Error ", e.getMessage(), e);
		}
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub

	}

	@Override
	public synchronized void close() {
		if (dataBase != null)
			dataBase.close();
		super.close();
	}

	public void createDataBase() {
		boolean dbExists = checkDbExists();
		SQLiteDatabase db;
		if (dbExists) {
			// do nothing
		} else {
			// By calling this method and empty database will be created into
			// the default system path
			// of your application so we are gonna be able to overwrite that
			// database with our database.
			db = this.getReadableDatabase();
			db.close();
			try {
				copyDataBase();
			} catch (IOException e) {
				String outFileName = DB_PATH + DB_NAME;

				File f = new File(outFileName);
				if (f.exists()) {
					f.delete();
				}
				e.printStackTrace();
				throw new Error("Error copying database");
			}
		}
	}

	public SQLiteDatabase openDataBase() throws SQLException {
		// Open the database
		String myPath = DB_PATH + DB_NAME;
		try
		{
		dataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS |SQLiteDatabase.OPEN_READONLY);
		}
		catch (Exception e) {
			// TODO: handle exception
			throw new Error("Error opening database");
		}
		return dataBase;
	}

	/**
	 * Check if the database already exist to avoid re-copying the file each
	 * time you open the application.
	 * 
	 * @return true if it exists, false if it doesn't
	 */
	private boolean checkDbExists() {
		SQLiteDatabase checkDB = null;

		try {
			String myPath = DB_PATH + DB_NAME;
			checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

		} catch (SQLiteException e) {

			// database does't exist yet.

		}

		if (checkDB != null) {

			checkDB.close();

		}

		return checkDB != null ? true : false;
	}

	/**
	 * Copies your database from your local assets-folder to the just created
	 * empty database in the system folder, from where it can be accessed and
	 * handled. This is done by transfering bytestream.
	 * */
	private void copyDataBase() throws IOException {
		 // Path to the just created empty db
		 String outFileName = DB_PATH + DB_NAME;
		
		OutputStream databaseOutputStream = new FileOutputStream(outFileName);
		InputStream databaseInputStream;

		byte[] buffer = new byte[1024];
		int length;

		AssetManager am = currentContext.getAssets();
		
		databaseInputStream =am.open(DB_NAME);
		while ((length = databaseInputStream.read(buffer)) > 0) {
			databaseOutputStream.write(buffer);
		}
		databaseInputStream.close();
		/*
		databaseInputStream =am.open("db.sqlite.002");
		while ((length = databaseInputStream.read(buffer)) > 0) {
			databaseOutputStream.write(buffer);
		}	
		databaseInputStream.close();
		*/
		databaseOutputStream.flush();
		databaseOutputStream.close();
	}

	public static void closeCursor(Cursor cursor) {
		if (cursor != null) {
			try {
				cursor.close();
			} catch (Exception ex) {

			}
		}
	}
}